package com.example.interviewdemo.myReentrantLock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @program my-project-model
 * @description:不可重入锁的例子 不可重入锁若当前线程执行某个方法已经获取了该锁，那么在方法中尝试再次获取锁的时候，就会获取不到被阻塞
 * @author: lee
 * @create: 2022/12/30 09:28
 */
public class NoReentrantLock {
    private boolean isLocked = false;
//    private Map<String, Boolean> lockedThread = new HashMap<>();

    /**
     * 判断是否已经被锁，如果锁住了则当前请求的线程进行等待
     * <p>
     * 否则进行加锁
     */
    public synchronized void lock() throws InterruptedException {
        System.out.println("进入lock加锁" + Thread.currentThread().getName());

        //当前线程如果已经获取到锁，则进行等待，否则加锁
        while (isLocked) {
            System.out.println("进入wait等待" + Thread.currentThread().getName());
            wait();
        }

        isLocked = true;

    }

//    public synchronized void lock() {
//        System.out.println("进入lock加锁" + Thread.currentThread().getName());
//        Thread thread = Thread.currentThread();
//        String name = thread.getName();
//        //当前线程如果已经获取到锁，则进行等待，否则加锁
//        if (lockedThread.get(name)) {
//
//        } else {
//            isLocked = true;
//            lockedThread.put(name, isLocked);
//        }
//
//    }

    public synchronized void unLock() {
        System.out.println("进入unlock解锁" + Thread.currentThread().getName());
        isLocked = false;
        //唤醒对象锁池里的一个线程
        notify();
    }
}
